#版本2：由于悉之埋点格式固定，直接层层拆解数据对比，效率高，泛用性低，若公司埋点格式改变则需要修改

import json
from config.logger import log
from json import JSONDecodeError
import os
from config.path import data_path





def json_reader(file_name:str,debug_mode = 0)->dict:
    """
    参数1： file_name:填写data文件夹中的文件名，注意需要带后缀，如input_data.json
    参数2： debug_mode:用于开启调试模式，1为开启，开启后控制台出现日志帮助调试json文件的格式，默认关闭
    返回值：返回一个字典类型变量data
    """

    #用于读取文件的函数
    try:
        # 尝试打开并读取两个 JSON 文件
        with open(file_name, 'r') as json1:

            # 尝试加载 JSON 数据
            data = json.load(json1)
            if debug_mode == 1:
                log.debug("JSON文件成功读取并解析！")
            return data

    except FileNotFoundError as fnf_error:
        log.error(f"文件未找到错误: {fnf_error}")
    except JSONDecodeError as json_error:
        log.error(f"JSON解析错误: {json_error}")
    except Exception as e:
        log.error(f"其他错误: {e}")


def data_split(data:dict,debug_mode = 0)->tuple:
    """
    参数1： data:需要拆解的数据变量，注意，需要保证data的结构符合悉之埋点json的结构
    参数2： debug_mode:用于开启调试模式，1为开启，开启后控制台出现日志帮助调试json文件的格式，默认关闭
    返回值：返回埋点标题类型，埋点标题，埋点数据三个变量组成的元组
    """

    #用于拆分数据的函数
    try:
        #定义作用域更大的变量用于记录埋点的标题和标题类型
        title_type,title_content = None,None

        #第零层固定有<track_data>键
        level1 = data["track_data"]
        if debug_mode == 1:
            log.info("第一层正确")

        #第一层固定为数组
        level2 = level1[0]
        if debug_mode == 1:
            log.info("第二层正确")

        #第三层为
        burying_data = None
        if debug_mode == 1:
            log.info("第三层正确")

        #第三次固定为字典，包括标题和数据
        for key in level2.keys():

            #由于格式固定，如果不是data键，那么另一个键值对一定是标题
            if key != "data":
                title_type = key#埋点标题类型
                title_content = level2[key]#埋点标题内容
                if debug_mode == 1:
                    log.info("标题解析正确")
            else:
                burying_data = level2[key] #埋点数据
                if debug_mode == 1:
                    log.info("数据解析正确")


        #以元组的形式返回
        return  title_type,title_content,burying_data
    except Exception as e1:
        log.critical("程序错误，json数据拆分出现错误，请检查格式")
        raise e1





def compare2():
    #由于悉之埋点格式固定，采用一层一层拆解的方式获取json信息

    #打开输入数据文件
    input_data = json_reader(file_name =os.path.join(data_path, 'input_data.json'))

    #获取拆分的输入数据
    input_data_split = data_split(input_data)


    # 用于存放拆分好的模板数据
    template_data = None
    template_data_split = None

    #匹配模板
    if input_data_split[0] == "action_type" and input_data_split[1]  == "ag_photo_generate":
        template_data = json_reader(file_name =os.path.join(data_path, 'ag_photo_generate.json'))


    #获取拆分的模板数据
    if template_data:
        template_data_split = data_split(template_data)
    else:
        log.error("程序错误，未匹配到模板")

    #利用集合运算比对数据
    #计算少参
    missing_parameter = set(template_data_split[2].keys()) - set(input_data_split[2].keys())
    if missing_parameter:
        log.error(f"缺少参数！！\n缺少：{missing_parameter}")
    else:
        log.info("参数完整~")

    #利用集合运算输出多出的参数
    over_parameter = set(input_data_split[2].keys()) - set(template_data_split[2].keys())
    log.warning(f"多出参数！\n  {over_parameter}")

    #筛选无效参数,显示必须参数详情
    log.info("以下为必须参数详情")
    for key in template_data_split[2].keys():
        if input_data_split[2][key] == -1:
            log.error(f"<----------无效参数!!!---------->\n  {key:<30}-----> {input_data_split[2][key]}")
        log.info(f"{key:<30}-----> {input_data_split[2][key]}")







if __name__ == "__main__":
    compare2()





































